package com.leinao.project.service;

import com.leinao.commons.Response;
import com.leinao.job.dto.JobTagDto;
import com.leinao.job.dto.ProjectJobStatisticsDto;
import com.leinao.job.dto.ProjectJobViewDto;
import com.leinao.login.dto.LoginResultDto;
import com.leinao.model.model.Model;
import com.leinao.project.dto.*;
import com.leinao.project.model.CopyProjectResult;
import com.leinao.project.model.PaiDataSet;
import com.leinao.project.model.Project;
import com.leinao.project.model.ProjectNotes;
import com.leinao.util.page.PageInfo;
import org.springframework.util.MultiValueMap;

import java.util.List;

/**
 *
 * @Description 项目服务
 * @author lizi
 * @date 2018/11/16 下午5:15
 * @Version 1.0
 */
public interface ProjectService {

    /**
     * @Description 获取公开数据集的项目列表
     * @param datasetId : 数据集ID
     * @param pageNumber : 当前页
     * @param pageSize : 每页条数
     * @author lizi
     * @date 2018/11/16 下午5:31
     */
    Response<PageInfo> getProjectListByPublicDatasetId(Long datasetId, String userId, Integer pageNumber, Integer pageSize);

    /**
     * @Description 获取我的数据集的项目列表
     * @param datasetId : 数据集ID
     * @param pageNumber : 当前页
     * @param pageSize : 每页条数
     * @author lizi
     * @date 2018/11/16 下午5:31
     */
    Response<PageInfo> getProjectListByPrivateDatasetId(Long datasetId, String userId, Integer pageNumber, Integer pageSize);

    /**
     * @Description 获取公开项目列表
     * @param sortType : 排序方式，参见com.leinao.constant.PublicProjectSortTypeEnum
     * @param categoryId : 分类ID
     * @param pageNumber : 当前页
     * @param pageSize : 每页条数
     * @author lizi
     * @date 2018/11/16 下午5:31
     */
    Response<PageInfo> getPublicProjectList(Integer sortType, Long categoryId, Integer pageNumber, Integer pageSize);

    /***
     * @Description 公开项目统计
     * @author lizi
     * @date 2018/11/29 下午7:19
     */
    Response<PublicProjectCollectDto> getPublicProjectCollectInfo();

    /***
     * @Description 我的项目统计
     * @author lizi
     * @date 2018/11/29 下午7:19
     */
    Response<ProjectCollectDto> getProjectCollectDto(String userId);

    /***
     * @Description 获取数据集信息
     * @param datasetId : 数据集ID
     * @author lizi
     * @date 2018/11/27 下午8:40
     */
    PaiDataSet getDatasetByDatasetId(Long datasetId);

    /***
     * @Description 公开项目
     * @param publicProjectParamDto : 项目公开参数
     * @param userInfo : 用户信息
     * @author lizi
     * @date 2018/11/27 下午8:40
     */
    Response<Project> openProject(PublicProjectParamDto publicProjectParamDto, LoginResultDto userInfo);

    /***
     * @Description 克隆项目数据准备
     * @param projectId : 项目ID
     * @param userInfo : 用户信息
     * @author weiwei
     * @date 2019/05/21 下午8:40
     */
    Response<CopyProjectResult> copyProject(Long projectId, String jobIds, LoginResultDto userInfo);

    /**
      * @Description   克隆项目入库
      * @param copyProjectResult    克隆项目信息
      * @param userInfo 用户信息
      * @return
      * @author:    weiwei
      * @Date:  2019/6/10 17:22
      */
    Response<Long> copyProjectInsert(CopyProjectResult copyProjectResult, LoginResultDto userInfo);

    /***
     * @Description 复制项目
     * @param project : 项目
     * @param userId : 用户ID
     * @author lizi
     * @date 2018/11/29 下午8:40
     */
    Response<Void> editProject(Project project, String userId);

    /***
     * @Description 查询项目笔记
     * @param projectId : 项目ID
     * @param userId : 用户ID
     * @author lizi
     * @date 2018/11/29 下午8:40
     */
    Response<ProjectNotes> getProjectNotes(Long projectId, String userId);

    /***
     * @Description 编辑项目笔记
     * @param projectNotes : 项目笔记信息
     * @param userId : 用户ID
     * @author lizi
     * @date 2018/11/29 下午8:40
     */
    Response<Void> editProjectNotes(ProjectNotes projectNotes, String userId);

    /***
     * @Description 获取公开项目明细
     * @param projectId : 项目ID
     * @author lizi
     * @date 2018/11/29 下午4:21
     */
    Response<Project> getPublicProjectDetail(Long projectId);
    
    /**
     * @description 创建项目
     * @param project  项目实体对象
     * @param dataSetIds 所选数据集id
     * @param userInfo 用户实体对象
     * @return
     * @author cuidongdong
     * @date 2019.5.8 17:47:00
     */
    Response<Project> createProject(Project project, String dataSetIds, String modelIds, LoginResultDto userInfo);

    /**
     *
     * 获取项目列表
     * @param userId 用户id
     * @param origin : 项目创建来源：null-所有，0-自己创建，1-复制
     * @param cp 当前页数
     * @param ps 每页条数
     * @return 返回项目列表-分页数据
     * @author wangshoufa
     * @date 2018年11月28日
     *
     */
	Response<PageInfo> getProjectList(String userId, Integer origin, Integer cp, Integer ps);

	/**
	  * 功能描述：获取项目明细
	  * @param projectId 项目id
	  * @param token 用户token
	  * @param cp 当前页
	  * @param ps 每页条数
	  * @return com.leinao.commons.Response<java.lang.Object>
	  * @Author: guoliangbo
	  * @Date: 2019/5/7 13:32
	  */
	Response<PageInfo> getProjectJobInfo(Long projectId,String jobTag,String taskStatus, String token, Integer cp, Integer ps);

	/**
	  * 功能描述：获取任务视图列表
	  * @param taskStatus 任务状态：根据任务状态过滤数据（null或空字符串: 所有数据，WAITING: 正在等待的任务，RUNNING: 正在运行的任务，STOPPED: 暂定的任务，SUCCEEDED: 已结束的任务，FAILED：失败
	  * @param pageNumber 当前页
	  * @param pageSize 每页条数
	  * @param userInfo 用户信息
	  * @return com.leinao.commons.Response<com.leinao.util.page.PageInfo>
	  * @Author: guoliangbo
	  * @Date: 2019/5/7 13:30
	  */
    Response<PageInfo> getTaskViewList(String taskStatus,String jobTag,Integer pageNumber, Integer pageSize, LoginResultDto userInfo);

    /**
      * 功能描述：获取公开项目信息
      * @param sortType 排序方式
      * @param cp 当前页
      * @param ps  每页条数
      * @return com.leinao.commons.Response<com.leinao.util.page.PageInfo>
      * @Author: guoliangbo
      * @Date: 2019/5/7 13:24
      */
	Response<PageInfo> getOpenProjectInfo(Integer sortType, Integer cp, Integer ps);

	/**
	  * 功能描述：项目名是否可用
	  * @param projectName 项目名
	  * @param userInfo 用户信息
	  * @return com.leinao.commons.Response<java.lang.Void>
	  * @Author: guoliangbo
	  * @Date: 2019/5/7 13:23
	  */
	Response<Void> isUsable4Name(String projectName, LoginResultDto userInfo);

    /**
     * @Description 搜索公开项目列表
     * @param search : 搜索内容
     * @param pageNumber : 当前页
     * @param pageSize : 每页条数
     * @author lizi
     * @date 2019/02/26 下午5:17
     */
    Response<PageInfo> searchPublicProjectList(String search, Integer pageNumber, Integer pageSize);

    /**
     * @Description 搜索公开项目列表
     * @author lizi
     * @date 2019/03/05 下午5:17
     */
    Response<ProjectJobStatisticsDto> getTaskStatistics(LoginResultDto userInfo);


    /**
     * @description 操作项目，新建时仅保存、编辑项目
     * @param project  项目实体对象
     * @param dataSetIds 所选数据集id
     * @param userInfo 用户实体对象
     * @return
     * @author cuidongdong
     * @date 2019.5.8 17:51:00
     */
	Response<Project> operateProject(Project project, String dataSetIds, String modelIds, LoginResultDto userInfo);

    /**
      * @Description  仅保存任务
      * @param project
      * @param userInfo
      * @return
      * @author:    weiwei
      * @Date:  2019/6/14 20:49
      */
	Response<Project> saveJob(Project project, LoginResultDto userInfo);

    /**
     * @Description 获取公开项目事例
     * @author lizi
     * @date 2019/03/13 下午5:31
     */
    Response<PublicProjectExampleDto> getPublicProjectExample();

    /**
     * @Description 	获取用户项目详情
     * @param projectId 项目Id
     * @return
     * @author:    weiwei
     * @Date:  2019/3/26 10:38
     */
    Response<Project> getUserProjectDetail(Long projectId, LoginResultDto userInfo);

    /**
      * 目前未使用，产品停止该功能，接口保留
      * 功能描述：获取用户任务详情
      * @param jobId 任务ID
      * @param userInfo 用户信息
      * @return com.leinao.commons.Response<java.lang.Object>
      * @Author: guoliangbo
      * @Date: 2019/5/7 13:21
      */
    Response<ProjectJobViewDto> getUserTaskDetail(Long jobId,  LoginResultDto userInfo);

    /**
      * 目前未使用，产品停止该功能，接口保留
      * 功能描述：根据用户id 查询用户项目数据
      * @param projectId 选中项目id
      * @param userId 用户id
      * @Return:com.leinao.commons.Response<java.util.List<com.leinao.project.dto.ProjectInfoDto>> 返回结果
      * @Author: Guo Liangbo
      * @Date:2019/5/19 16:44
      */
    Response<ProjectInfoDto> getProjectOutputs(Long projectId,String userId);

    /**
      * 功能描述: 添加标签
      * @param projectId 项目ID
      * @param jobId 任务ID
      * @param jobTag 任务标签
      * @Return:com.leinao.commons.Response<com.leinao.project.model.Project>
      * @Author:HuoPengfei
      * @Date:2019/5/15 18:46
      */
    void saveJobTag(Long projectId, Long jobId,String userId,String jobTag);

    /**
      * 功能描述: 修改标签
      * @param projectId 项目ID
      * @param jobId 任务ID
      * @param jobTag 任务标签
      * @Return:com.leinao.commons.Response<com.leinao.project.model.Project>
      * @Author:HuoPengfei
      * @Date:2019/5/15 18:46
      */
    void updateJobTag(Long projectId, Long jobId,String userId,String jobTag);

    /**
      * 功能描述: 获取项目标签列表
      * @param projectId 项目ID
      * @Return:java.util.List<java.lang.String>
      * @Author:HuoPengfei
      * @Date:2019/5/16 15:17
      */

    Response<List<JobTagDto>> getjobTagListByProId(Long projectId);

    /**
      * 功能描述: 获取项目标签列表
      * @param userId 用户ID
      * @Return:java.util.List<java.lang.String>
      * @Author:HuoPengfei
      * @Date:2019/5/16 15:17
      */

    Response<List<JobTagDto>> getjobTagListByUserId(String userId);

    /**
      * 功能描述：待公开项目校验私有数据集、私有模型
      * @param userId 用户id
      * @param id 项目id
      * @return com.leinao.project.dto.ProjectPrivateInfo 返回项目私有信息
      * @Author: guoliangbo
      * @Date: 2019/6/6 15:16
      */
    Response<ProjectPrivateInfo> getPrivateInfo(String userId,Long id);

    /**
      * 功能描述：项目引用output Info
      * @param userId 用户id
      * @param projectId 当前项目id
      * @return com.leinao.commons.Response<com.leinao.project.dto.ProjectInfoDto> 返回引用项目信息
      * @Author: guoliangbo
      * @Date: 2019/5/21 13:41
      */
    Response<List<ProjectInfoDto>> projectQuoteInfo(String userId, Long projectId);

    /**
     * @Description 请求文件中心接口
     * @param paramMap : 接口参数
     * @param userInfo : 用户信息
     * @param url : 请求地址
     * @author lizi
     * @date 2018/12/6 上午11:49
     */
    Response<String> requestFileCenter(MultiValueMap<String, String> paramMap, LoginResultDto userInfo, String url);

    /**
      * 功能描述：获取公开项目信息
      * @param userInfo 用户信息
      * @param projectId 项目id
      * @return: com.leinao.commons.Response<com.leinao.project.dto.PublicProjectInfo> 公开项目信息
      * @Author: Guo Liangbo
      * @Date: 2019/6/4 14:12
      */
    Response<PublicProjectInfo> publicProjectInfo(LoginResultDto userInfo, Long projectId);


    /**
     * 功能描述：获取最近新建的jupyter调试任务配置
     * @param userId 用户ID
     * @Author: lizi
     * @Date: 2019/6/5 22:21
     */
    Response<String> getLastJupyterJobConfig(String userId);

    Response<List<Model>> getProjectUseModels(Long projectId);
}
